﻿// -------------------------------------------------------------------------
//    @FileName         :    MockItemDesc.h
//    @Author           :    gaoyi
//    @Date             :    2025/1/20
//    @Email            :    445267987@qq.com
//    @Module           :    MockItemDesc
//
// -------------------------------------------------------------------------

#pragma once

#include <unordered_map>
#include <memory>
#include "ResStore/DescStore/ItemDesc.h"
#include "E_ItemData.nanopb.h"

/**
 * @brief Mock物品描述类
 * 
 * 用于单元测试，提供预定义的物品描述数据
 * 模拟从Excel表格中读取的物品数据
 */
class MockItemDesc {
public:
    MockItemDesc();
    ~MockItemDesc();
    
    /**
     * @brief 初始化Mock数据
     * @return 初始化结果
     */
    int Initialize();
    
    /**
     * @brief 获取物品描述
     * @param itemId 物品ID
     * @return 物品描述指针，找不到返回nullptr
     */
    const E_Item* GetDesc(int itemId) const;
    
    /**
     * @brief 添加物品描述
     * @param itemId 物品ID
     * @param desc 物品描述
     */
    void AddItemDesc(int itemId, const E_Item& desc);
    
    /**
     * @brief 清空所有物品描述
     */
    void Clear();
    
    /**
     * @brief 获取物品描述数量
     * @return 物品描述数量
     */
    size_t GetDescCount() const;

private:
    /**
     * @brief 创建默认的测试物品描述
     */
    void CreateDefaultTestItems();
    
    /**
     * @brief 创建普通物品描述
     * @param itemId 物品ID
     * @param name 物品名称
     * @param itemType 物品类型
     * @param quality 品质
     * @param maxStack 最大堆叠数
     * @param canBind 是否可绑定
     * @return 物品描述
     */
    E_Item CreateItemDesc(int itemId, const std::string& name, int itemType, 
                         int quality = 1, int maxStack = 1, bool canBind = false);
    
    /**
     * @brief 创建装备描述
     * @param equipId 装备ID
     * @param name 装备名称
     * @param equipType 装备类型
     * @param quality 品质
     * @param level 等级
     * @return 装备描述
     */
    E_Item CreateEquipDesc(int equipId, const std::string& name, int equipType,
                          int quality = 1, int level = 1);
    
    /**
     * @brief 创建消耗品描述
     * @param itemId 消耗品ID
     * @param name 消耗品名称
     * @param effectType 效果类型
     * @param maxStack 最大堆叠数
     * @return 消耗品描述
     */
    E_Item CreateConsumableDesc(int itemId, const std::string& name, 
                               int effectType, int maxStack = 100);

private:
    // 物品描述存储
    std::unordered_map<int, std::unique_ptr<E_Item>> m_itemDescs;
    
    // 是否已初始化
    bool m_initialized;
};

/**
 * @brief Mock物品描述管理器
 * 
 * 单例模式，用于管理测试期间的物品描述
 */
class MockItemDescManager {
public:
    /**
     * @brief 获取单例实例
     * @return 单例实例
     */
    static MockItemDescManager* Instance();
    
    /**
     * @brief 获取物品描述
     * @param itemId 物品ID
     * @return 物品描述指针
     */
    const E_Item* GetItemDesc(int itemId) const;
    
    /**
     * @brief 设置Mock物品描述
     * @param mockDesc Mock物品描述对象
     */
    void SetMockItemDesc(MockItemDesc* mockDesc);
    
    /**
     * @brief 清理Mock数据
     */
    void Cleanup();

private:
    MockItemDescManager();
    ~MockItemDescManager();
    
    // 禁止拷贝和赋值
    MockItemDescManager(const MockItemDescManager&) = delete;
    MockItemDescManager& operator=(const MockItemDescManager&) = delete;

private:
    MockItemDesc* m_mockDesc;
    static MockItemDescManager* s_instance;
};

// 测试用的物品ID常量
namespace TestItemIds {
    // 普通物品
    constexpr int NORMAL_ITEM_1 = 10001;
    constexpr int NORMAL_ITEM_2 = 10002;
    constexpr int NORMAL_ITEM_3 = 10003;
    
    // 装备
    constexpr int WEAPON_SWORD = 20001;
    constexpr int WEAPON_BOW = 20002;
    constexpr int ARMOR_HELMET = 20003;
    constexpr int ARMOR_CHEST = 20004;
    constexpr int ARMOR_LEGS = 20005;
    
    // 消耗品
    constexpr int POTION_HP = 30001;
    constexpr int POTION_MP = 30002;
    constexpr int FOOD_BREAD = 30003;
    
    // 材料
    constexpr int MATERIAL_WOOD = 40001;
    constexpr int MATERIAL_STONE = 40002;
    constexpr int MATERIAL_IRON = 40003;
    
    // 可堆叠物品
    constexpr int STACKABLE_ARROW = 50001;
    constexpr int STACKABLE_COIN = 50002;
    
    // 唯一物品
    constexpr int UNIQUE_QUEST_ITEM = 60001;
    constexpr int UNIQUE_KEY = 60002;
    
    // 特殊物品
    constexpr int TREASURE_MAP = 70001;
    constexpr int PARTNER_EQUIP = 80001;
    constexpr int FASHION_ITEM = 90001;
}

// 测试用的物品类型常量
namespace TestItemTypes {
    constexpr int NORMAL = 0;
    constexpr int EQUIP = 1;
    constexpr int CONSUMABLE = 2;
    constexpr int MATERIAL = 3;
    constexpr int TREASURE_MAP = 4;
    constexpr int PARTNER_EQUIP = 5;
    constexpr int FASHION = 6;
}

// 测试用的装备类型常量
namespace TestEquipTypes {
    constexpr int WEAPON = 1;
    constexpr int HELMET = 2;
    constexpr int CHEST = 3;
    constexpr int LEGS = 4;
    constexpr int BOOTS = 5;
    constexpr int ACCESSORY = 6;
}

// 测试用的品质常量
namespace TestQuality {
    constexpr int WHITE = 1;
    constexpr int GREEN = 2;
    constexpr int BLUE = 3;
    constexpr int PURPLE = 4;
    constexpr int ORANGE = 5;
    constexpr int RED = 6;
} 